package top.wineye.spring.bean.destroy;

import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import top.wineye.spring.bean.factory.AnotherUserFactory;

@Configuration
public class BeanDestroyDemo {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context
                = new AnnotationConfigApplicationContext(BeanDestroyDemo.class);

        /*
            bean 的销毁钩子方式跟 initialization 相似
            1. 通过 javax 的 @PreDestroy
            2. 通过 XmlBeanDefinition 的 destroy-method 指定 （@Bean 的 destroyMethod）
            3. 实现 Spring 提供的 DisposableBean 接口

            同理，也可以通过bean definition 的 java接口实现，来试试
            实际上这种方式 等同于第二种
         */

        BeanDefinitionBuilder bdb
                = BeanDefinitionBuilder.genericBeanDefinition(AnotherUserFactory.class);
        bdb.setDestroyMethodName("destroyMethod");
        bdb.setLazyInit(false);

        context.registerBeanDefinition("auf", bdb.getBeanDefinition());

        context.getBeansOfType(AnotherUserFactory.class);

        context.close();
    }


    @Bean(destroyMethod = "destroyMethod")
    public AnotherUserFactory anotherUserFactory() {
        return new AnotherUserFactory();
    }


}
